gdk/surface: Add API to request 'compute-size' clock phase
authorJonas Ådahl <jadahl@gmail.com>
Tue, 24 Nov 2020 15:03:07 +0000 (16:03 +0100)
committerJonas Ådahl <jadahl@gmail.com>
Mon, 7 Dec 2020 08:46:39 +0000 (09:46 +0100)
gdk/gdksurface.c
gdk/gdksurfaceprivate.h

index d1e6192e53082def34b9971b845345bf3bf12b9c..0d36a58a0330932fd5cff5ad74cfa14c50792fe8 100644 (file)
@@ -1285,6 +1285,25 @@ gdk_surface_emit_size_changed (GdkSurface *surface,
   g_signal_emit (surface, signals[SIZE_CHANGED], 0, width, height);
 }
 
+void
+gdk_surface_request_compute_size (GdkSurface *surface)
+{
+  GdkFrameClock *frame_clock;
+
+  if (surface->update_freeze_count ||
+      gdk_surface_is_toplevel_frozen (surface))
+    {
+      surface->pending_request_compute_size = TRUE;
+      return;
+    }
+
+  frame_clock = gdk_surface_get_frame_clock (surface);
+  g_return_if_fail (frame_clock);
+
+  gdk_frame_clock_request_phase (frame_clock,
+                                 GDK_FRAME_CLOCK_PHASE_COMPUTE_SIZE);
+}
+
 static void
 gdk_surface_process_updates_internal (GdkSurface *surface)
 {
@@ -1530,8 +1549,13 @@ gdk_surface_thaw_updates (GdkSurface *surface)
           surface->pending_schedule_update = FALSE;
           gdk_surface_schedule_update (surface);
         }
-    }
 
+      if (surface->pending_request_compute_size)
+        {
+          surface->pending_request_compute_size = FALSE;
+          gdk_surface_request_compute_size (surface);
+        }
+    }
 }
 
 /*
index 5f5c3c178d48a9504fcbd90580228b0acab28aa2..a6a981dbb86932cfc74e1fbf1af089842fa29709 100644 (file)
@@ -54,6 +54,7 @@ struct _GdkSurface
   cairo_region_t *update_area;
   guint update_freeze_count;
   gboolean pending_schedule_update;
+  gboolean pending_request_compute_size;
   /* This is the update_area that was in effect when the current expose
      started. It may be smaller than the expose area if we'e painting
      more than we have to, but it represents the "true" damage. */
@@ -337,6 +338,8 @@ void       gdk_surface_emit_size_changed   (GdkSurface       *surface,
                                             int               width,
                                             int               height);
 
+void       gdk_surface_request_compute_size (GdkSurface      *surface);
+
 GDK_AVAILABLE_IN_ALL
 void           gdk_surface_request_motion (GdkSurface *surface);